package com.dolphin.aiagentplatform.utils;

import com.dolphin.aiagentplatform.constant.ResponseCodeConst;
import com.dolphin.aiagentplatform.exception.BusinessException;
import com.dolphin.aiagentplatform.model.vo.user.UserVO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 会话管理工具类（弃用，已被TokenManager替代）
 * 提供用户会话管理相关功能
 */
@Slf4j
public class SessionManager {

    /**
     * 用户登录状态的session key
     */
    private static final String USER_LOGIN_STATE = "user_login_state";

    /**
     * 登录时间的session key
     */
    private static final String LOGIN_TIME = "login_time";

    /**
     * 会话过期时间（毫秒）
     * 默认30分钟
     */
    private static final long SESSION_TIMEOUT_MILLIS = 30 * 60 * 1000;

    /**
     * 用户登录IP记录
     */
    private static final String USER_LOGIN_IP = "user_login_ip";

    /**
     * 用户设备信息
     */
    private static final String USER_AGENT = "user_agent";

    /**
     * 在线用户会话存储 (userId -> sessionId)
     * 可以用于在线用户统计、会话管理等
     */
    private static final Map<Long, String> onlineUserSessions = new ConcurrentHashMap<>();

    /**
     * 保存用户会话信息
     *
     * @param request HTTP请求
     * @param userVO  用户视图对象
     */
    public static void saveUserSession(HttpServletRequest request, UserVO userVO) {
        if (userVO == null || userVO.getId() == null) {
            throw new BusinessException(ResponseCodeConst.PARAMS_ERROR, "用户信息不完整");
        }

        HttpSession session = request.getSession();

        // 记录用户登录状态
        session.setAttribute(USER_LOGIN_STATE, userVO);

        // 记录登录时间
        session.setAttribute(LOGIN_TIME, System.currentTimeMillis());

        // 记录用户IP
        String ipAddress = SecurityUtils.getClientIpAddress(request);
        session.setAttribute(USER_LOGIN_IP, ipAddress);

        // 记录用户设备信息
        String userAgent = request.getHeader("User-Agent");
        session.setAttribute(USER_AGENT, userAgent);

        // 记录在线用户
        onlineUserSessions.put(userVO.getId(), session.getId());

        log.debug("用户会话已保存，用户ID:{}, 会话ID:{}, IP:{}", userVO.getId(), session.getId(), ipAddress);
    }

    /**
     * 获取当前登录用户信息
     *
     * @param request HTTP请求
     * @return 当前登录用户信息，如果未登录则返回null
     */
    public static UserVO getLoginUser(HttpServletRequest request) {
        if (request == null) {
            return null;
        }

        HttpSession session = request.getSession(false);
        if (session == null) {
            return null;
        }

        // 获取会话中的用户信息
        Object userObj = session.getAttribute(USER_LOGIN_STATE);
        if (userObj == null) {
            return null;
        }

        // 检查会话是否过期
        Long loginTime = (Long) session.getAttribute(LOGIN_TIME);
        if (loginTime == null || System.currentTimeMillis() - loginTime > SESSION_TIMEOUT_MILLIS) {
            // 会话过期，清除会话
            removeUserSession(request);
            return null;
        }

        // 更新登录时间
        session.setAttribute(LOGIN_TIME, System.currentTimeMillis());

        return (UserVO) userObj;
    }

    /**
     * 获取当前登录用户信息（如果未登录则抛出异常）
     *
     * @param request HTTP请求
     * @return 当前登录用户信息
     * @throws BusinessException 如果用户未登录
     */
    public static UserVO getAndCheckLoginUser(HttpServletRequest request) {
        UserVO userVO = getLoginUser(request);
        if (userVO == null) {
            throw new BusinessException(ResponseCodeConst.NOT_LOGIN_ERROR, "未登录");
        }
        return userVO;
    }

    /**
     * 移除用户会话
     *
     * @param request HTTP请求
     */
    public static void removeUserSession(HttpServletRequest request) {
        if (request == null) {
            return;
        }

        HttpSession session = request.getSession(false);
        if (session == null) {
            return;
        }

        // 获取用户ID以从在线用户映射中移除
        Object userObj = session.getAttribute(USER_LOGIN_STATE);
        if (userObj instanceof UserVO) {
            UserVO userVO = (UserVO) userObj;
            onlineUserSessions.remove(userVO.getId());
            log.debug("用户会话已移除，用户ID:{}", userVO.getId());
        }

        // 清除会话
        session.removeAttribute(USER_LOGIN_STATE);
        session.removeAttribute(LOGIN_TIME);
        session.removeAttribute(USER_LOGIN_IP);
        session.removeAttribute(USER_AGENT);
    }

    /**
     * 检查用户是否在线
     *
     * @param userId 用户ID
     * @return 是否在线
     */
    public static boolean isUserOnline(Long userId) {
        return userId != null && onlineUserSessions.containsKey(userId);
    }

    /**
     * 获取在线用户数量
     *
     * @return 在线用户数量
     */
    public static int getOnlineUserCount() {
        return onlineUserSessions.size();
    }

    /**
     * 检查用户会话IP是否发生变化
     * 可用于检测会话劫持
     *
     * @param request HTTP请求
     * @return 如果IP发生变化则返回true
     */
    public static boolean isIpChanged(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session == null) {
            return false;
        }

        String storedIp = (String) session.getAttribute(USER_LOGIN_IP);
        if (storedIp == null) {
            return false;
        }

        String currentIp = SecurityUtils.getClientIpAddress(request);

        return !storedIp.equals(currentIp);
    }
} 